Skip to main content
  1. posts/

Setting Up PHPUnit and GitHub Actions for a PHP Project

This tutorial shows you how to set up a basic PHP project with Composer, write tests using PHPUnit, and automate test execution with GitHub Actions. It’s intended for developers who want a clean starting point for building and testing PHP code.

You’ll create the project structure, configure Composer, add a simple test case, and define a GitHub Actions workflow to run tests on each push or pull request. By the end, you’ll have a fully working setup for local and automated testing.


Setting Up a PHP Project #

Before you begin, ensure that PHP and Composer are installed on your computer.

php --version
composer --version

Initialise Your PHP Project #

Create a folder for your project.

mkdir conditional-test-execution
cd conditional-test-execution

Initialize a new PHP project by running composer init in your project directory.

composer init

This will create a composer.json file. Ensure that your composer.json has the following structure.

{  
    "name": "software-witchcraft/conditional-test-execution",  
    "description": "A small demo project for showcasing conditional PHP test execution in GitHub Actions, created to support a tutorial.",  
    "type": "project",  
    "license": "mit",  
    "autoload": {  
        "psr-4": {  
            "SoftwareWitchcraft\\ConditionalTestExecution\\": "src/"  
        }  
    },  
    "authors": [  
        {  
            "name": "Software Witchcraft",  
            "email": "[email protected]"  
        }  
    ],  
    "require": {}  
}

Add PHPUnit as a Dependency #

Add PHPUnit via Composer. Run the following command in your project’s root directory.

composer require --dev phpunit/phpunit ^12

This command installs PHPUnit and its dependencies. The --dev flag indicates that PHPUnit is a development dependency, not required for the production environment.

Configure PHPUnit #

Create a phpunit.xml file in your project root. This file will hold your PHPUnit configuration. Here’s a basic example.

<phpunit bootstrap="vendor/autoload.php" colors="true">
    <testsuites>
	    <testsuite name="My Test Suite">
	        <directory>tests</directory>
	    </testsuite>
	</testsuites>
</phpunit>

In this file, bootstrap points to Composer’s autoloader, and the tests directory is where your test files will reside.

Write Your First Test #

Create file Greeter.php in your src folder …

touch ./src/Greeter.php

… with following content

<?php

namespace SoftwareWitchcraft\ConditionalTestExecution;

class Greeter
{
    public function greet(string $name): string
    {
        return 'Hello, ' . $name . '!';
    }
}

Create a tests directory in your project root.

mkdir tests

Inside this directory, create a test file, for example, GreeterTest.php

touch ./tests/GreeterTest.php

… with a simple PHPUnit test class.

<?php 

use PHPUnit\Framework\TestCase;

use SoftwareWitchcraft\ConditionalTestExecution\Greeter;

class GreeterTest extends TestCase
{
    public function testGreetsWithName(): void
    {
        $greeter = new Greeter();

        $greeting = $greeter->greet('Alice');

        $this->assertSame('Hello, Alice!', $greeting);
    }
}

Running Tests Locally #

To run your tests, execute the following command in your project root:

./vendor/bin/phpunit --testdox

This command runs all the tests defined in your tests directory. PHPUnit will look for any files ending in Test.php and execute them.

Setup Git Repository and Push Your Project to GitHub #

Init you git repository.

git init

Create .gitignore file …

touch .gitignore

… with following content

/vendor/
/composer.lock
/.phpunit.result.cache
/.idea/
.DS_Store

Add and commit all your changes to your repository.

git add . 
git commit -m "initial commit"

Create a repository on GitHub, and link it to your local repository.

git remote add origin [email protected]:yourusername/your-repository-name.git

Don’t forget to update yourusername/your-repository-name!

Push your local repository to GitHub.

git push -u origin main

Now that we have our PHP project and PHPUnit setup complete, let’s move on to the next section where we will set up GitHub Actions to automate our testing process.


Setting Up the GitHub Actions Environment #

To start leveraging GitHub Actions, you need to set up a workflow. A workflow is a set of automated procedures and tasks that are executed based on defined events, like a push or a pull request.

Create a GitHub Actions Workflow File #

In your project repository, create directory .github/workflows.

mkdir -p ./.github/workflows

Inside this directory, create a new file named RunTests.yml (or any other name you prefer, but keep the .yml extension).

touch ./.github/workflows/RunTests.yml

Define the Workflow #

Start the YAML file with a name for the workflow and specify the trigger events. Commonly, workflows are triggered on push or pull request events. For example:

name: Run unit tests

on:
    push:
        branches: [ main ]
    pull_request:
        branches: [ main ]

jobs:
    build:
        runs-on: ubuntu-latest

        steps:
            - name: Check out repository code
              uses: actions/checkout@v4

            - name: Install PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: '8.5' # Specify the PHP version
                  tools: composer:v2, phpunit:v9.6
                  coverage: none

            - name: Check PHP Version
              run: php -v

            - name: Install dependencies
              run: composer install # Install PHP dependencies

            - name: Run PHPUnit tests
              run: ./vendor/bin/phpunit --testdox # Execute PHPUnit tests

Commit and Push the Workflow File #

After setting up the RunTests.yml file, commit it to your repository and push it to GitHub:

git add .github/workflows/phpunit.yml
git commit -m "Add GitHub Actions workflow"
git push origin main

Once you push these changes to GitHub, the Run PHPUnit Tests workflow will be triggered on the next push or pull request to the main branch, automatically running your PHPUnit tests in the specified environment.


You’ve now set up a complete PHP project with local testing using PHPUnit and automated test execution via GitHub Actions. This setup helps ensure your code stays reliable by catching issues early with every push or pull request. From here, you can continue building features, adding more tests, and extending your CI workflow as needed.

The complete code for this project is available in the GitHub repository. You can explore the structure, test setup, and workflow configuration in one place and use it as a reference or starting point for your own projects.